package com.woniu.teachmall.service;

import com.woniu.teachmall.entity.Address;
import com.woniu.teachmall.mapper.AddressMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;

/**
 * 用户地址管理服务
 * 提供地址的增删改查及默认地址处理功能
 */
@Service
public class AddressService {
    @Autowired
    private AddressMapper addressMapper;

    /**
     * 获取指定用户的全部地址列表
     * @param userId 用户ID
     * @return 该用户的地址集合（按添加时间倒序）
     */
    public List<Address> getAddress(Integer userId) {
        return addressMapper.getAddress(userId);
    }

    /**
     * 根据地址ID查询地址详情
     * @param addressId 地址记录ID
     * @return 地址实体对象
     */
    public Address getAddressById(Integer addressId) {
        return addressMapper.getAddressById(addressId);
    }

    /**
     * 新增用户地址（包含业务规则校验）
     * @param userId 用户ID
     * @param address 地址实体对象（需包含def默认地址标识）
     * @return 包含自增ID的地址对象
     * @throws RuntimeException 当用户地址超过10条时抛出
     */
    @Transactional
    public Address addAddress(Integer userId, Address address) {
        // 校验地址数量上限
        int currentCount = addressMapper.countByUserId(userId);
        if (currentCount >= 10) {
            throw new RuntimeException("用户地址已达上限（最多10条）");
        }

        // 默认地址处理逻辑
        if (Integer.parseInt(address.getDef()) == 1) {
            // 清除已有默认地址标记
            addressMapper.clearDefaultFlags(userId);
        } else if (currentCount == 0) {
            // 首次添加强制设为默认地址
            address.setDef("1");
        }

        address.setUserId(userId);
        addressMapper.addAddress(address);
        return address; // 返回包含数据库生成ID的实体
    }

    /**
     * 更新用户地址信息
     * @param userId 用户ID（用于校验归属权）
     * @param address 更新后的地址实体
     */
    @Transactional
    public void updateAddress(Integer userId, Address address) {
        if (Integer.parseInt(address.getDef()) == 1) {
            // 设置新默认地址前清除其他默认标记
            addressMapper.clearDefaultFlags(userId);
        }
        address.setUserId(userId);
        addressMapper.updateAddress(address);
    }

    /**
     * 删除指定地址记录
     * @param addressId 要删除的地址ID
     * @apiNote 删除前需在前端校验地址是否可删（如默认地址不可删等）
     */
    @Transactional
    public void deleteAddress(Integer addressId) {
        addressMapper.deleteAddress(addressId);
    }
}